Independent Dog

My EDA life record

Const in C++


Perface

這幾天在寫 ofstream overloading時,因為記錯const位置代表的意義所以花了很多時間搞懂以前為求速成所堆積的腦內業障XD。不過大部分浪費時間的地方還要拜一篇寫錯的介紹文所賜,所以趁著記憶清醒時自己整理一篇。


Table

  1. variable
  2. pointer
  3. function
  4. class constructor


1. variable

基本數據修飾在位置上其實沒什麼差別。

1
2
const int variable1 = 10;
int const variable2 = 10;

variable1 和 variable2 實際上是相同的東西,當然在陣列等其他基本數據類別也是一樣的狀況。

2. pointer

實際上會看到的狀況大概分成以下四種

1
2
3
4
const int* veriable1 = & data_base
int const *veriable2 = & data_base
int* const veriable3 = & data_base
const int* const veriable4 = & data_base

第一次看到時通常大概都會跟我一樣一個頭兩個大~~不過我們如果加上括號就會很容易理解了

1
2
3
4
const (int*) (veriable1) = & data_base // 記憶體位置所指向的內容是常數
(int) const (*veriable2) = & data_base // 同上
(int*) const (veriable3) = & data_base // 所指向的記憶體位置不能變更
const (int*) const (veriable4) = & data_base // 不准動,都不准動!!!!

如果還是不懂就搭配以下範例吧~

1
2
3
4
5
6
7
int foo( [1] int [2] * [3] a)
{
//當const 放在[1][2][3]時
a=new int(100);//[3]會錯在這一行
*a=50; //[1][2]會錯在這一行
return 1;
}

3.function

通常會用到這個都是在class的member function上,不過要記得static member function後頭不能加上const喔!!

1
2
3
4
5
6
7
8
9
10
11
12
class foo
{
public:
int set(int x);
private:
int value;
}
[1] int [2] foo::set(int x) [3]
{
value = x;
}

[1] 和 [2] 都是指回傳的數值會是常數。[3] 則是整個member function中,都不可以更動到物件成員。所以如果將const放在[3]的位置上的化這個範例就會產生complier error

4.class constructor

會寫這個主要都是這一個部分的關係 哈哈哈!!


如果在物件中直接定義const變量一定會發生錯誤,因為在compiler初始化時無法做定義

1
2
3
4
5
6
class foo
{
public:
const int size = 100;//噔噔 錯誤!!
private:
}

如果想要建構子初始化常數變量可用以下辦法

1
2
3
4
5
6
7
8
class foo
{
public:
foo(int size);
private:
const int size;
};
foo::foo(int size):size(size){}

⬅️ Go back